package com.qingxin.sys.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.time.DateUtils;
import org.joda.time.DateTime;

public class DateUtil extends DateUtils {

	/** 日期格式化 yyyy-MM-dd */
	public static final String DATE_FORMAT = "yyyy-MM-dd";
	/** 时间格式化 HH:mm:ss */
	public static final String TIME_FORMAT = "HH:mm:ss";
	/** 日期数据格式化 yyyy-MM-dd HH:mm:ss */
	public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	/** 日期时间完整格式化（带毫秒）yyyy-MM-dd HH:mm:ss.SSS */
	public static final String FULL_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
	
	
	/**
	 * 格式化为：yyyy-MM-dd
	 * @param date
	 * @return
	 */
	public static String fmtDate(Date date){
		return format(date, DATE_FORMAT);
	}
	
	/**
	 * 格式化为：yyyy-MM-dd HH:mm:ss
	 * @param date
	 * @return
	 */
	public static String fmtDateTime(Date date){
		return format(date, DATETIME_FORMAT);
	}
	
	
	/**
	 * 日期字符串转换为java.util.Date
	 * @param dateString
	 * @param pattern 匹配格式,如:yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static Date parse(String dateString, String pattern) {
		try {
			return (new SimpleDateFormat(pattern)).parse(dateString);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	
	/**
	 * Date转换为指定格式的日期字符串
	 * @param date 日期
	 * @param pattern 匹配格式,如:yyyy-MM-dd HH:mm:ss
	 * @return 转换后的字符串
	 */
	public static String format(Date date, String pattern) {
		if (date == null) {
			return null;
		}
		try {
			return (new SimpleDateFormat(pattern)).format(date);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	/**
	 * 创建一个新的日期对象
	 * @param year
	 * @param month 月份，1-12
	 * @param date
	 * @return
	 */
	public static Date newDate(int year, int month, int date){
		DateTime dateTime = new DateTime(year, month, date, 0, 0, 0, 0);
		return dateTime.toDate();
	}
	
	
	/**
	 * 创建一个新的日期对象
	 * @param year
	 * @param month 月份，1-12
	 * @param date
	 * @param hour
	 * @param minute
	 * @param second
	 * @param millisecond
	 * @return
	 */
	public static Date newDate(int year, int month, int date, int hour, int minute, int second, int millisecond){
		DateTime dateTime = new DateTime(year, month, date, hour, minute, second, millisecond);
		return dateTime.toDate();
	}
	
	
	/**
	 * 判断给定日期是否闰年年份
	 * @param date
	 * @return
	 */
	public static boolean isLeapYear(Date date){
		return (new DateTime(date)).year().isLeap();
	}
	
	
	/**
	 * 获取给定日期的当前月份最大天数
	 * @param date
	 * @return 大月31；小月30；二月平年28、闰年29
	 */
	public static int getMaxDaysInMonth(Date date){
		return (new DateTime(date)).dayOfMonth().getMaximumValue();
	}
	
	
	/**
	 * 将指定日期对象的日期设置为指定值
	 * @param date
	 * @param year
	 * @param month 月份，1-12
	 * @param day
	 * @return
	 */
	public static Date setDate(Date date, int year, int month, int day){
		return (new DateTime(date)).withDate(year, month, day).toDate();
	}
	
	
	/**
	 * 将指定日期对象的时间设置为指定值
	 * @param date
	 * @param hour
	 * @param minute
	 * @param second
	 * @param millisecond
	 * @return
	 */
	public static Date setTime(Date date, int hour, int minute, int second, int millisecond){
		return (new DateTime(date)).withTime(hour, minute, second, millisecond).toDate();
	}
	
	
	/**
	 * 将指定日历对象的时间设置为指定值
	 * @param calendar
	 * @param hour
	 * @param minute
	 * @param second
	 * @param millisecond
	 * @return
	 */
	public static Calendar setTime(Calendar calendar, int hour, int minute, int second, int millisecond){
		calendar.set(Calendar.HOUR_OF_DAY, hour);
		calendar.set(Calendar.MINUTE, minute);
		calendar.set(Calendar.SECOND, second);
		calendar.set(Calendar.MILLISECOND, millisecond);
		return calendar;
	}
	
	
	/**
	 * 将指定日期对象的时间部分置0，仅保留日期部分
	 * @param date
	 * @return
	 */
	public static Date cutDate(Date date){
		return setTime(date, 0, 0, 0, 0);
	}
	
	
	/**
	 * 获取月份的第一天
	 * @param date
	 * @return
	 */
	public static Date firstDayOfMonth(Date date){
		return (new DateTime()).dayOfMonth().withMinimumValue().toDate();
	}
	
	
	/**
	 * 获取月份的最后一天
	 * @param date
	 * @return
	 */
	public static Date lastDayOfMonth(Date date){
		return (new DateTime()).dayOfMonth().withMaximumValue().toDate();
	}
	
	
	/**
	 * 获取年份的第一天
	 * @param date
	 * @return
	 */
	public static Date firstDayOfYear(Date date){
		return (new DateTime()).dayOfYear().withMinimumValue().toDate();
	}
	
	
	/**
	 * 获取年份的最后一天
	 * @param date
	 * @return
	 */
	public static Date lastDayOfYear(Date date){
		return (new DateTime()).dayOfYear().withMaximumValue().toDate();
	}
	
	
	/**
	 * 判断给定的两个日期对象是否在同一年内
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameYear(Date date1, Date date2){
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(date1);
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(date2);
		
		return cal1.get(Calendar.YEAR)==cal2.get(Calendar.YEAR);
	}
	
	
	/**
	 * 判断给定的两个日期对象是否在同一月内
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameMonth(Date date1, Date date2){
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(date1);
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(date2);
		
		return cal1.get(Calendar.YEAR)==cal2.get(Calendar.YEAR)
				&& cal1.get(Calendar.MONTH)==cal2.get(Calendar.MONTH);
	}
	
	
	/**
	 * 判断给定的两个日期对象是否在同一天内
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameDay(Date date1, Date date2){
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(date1);
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(date2);
		
		return cal1.get(Calendar.YEAR)==cal2.get(Calendar.YEAR)
				&& cal1.get(Calendar.MONTH)==cal2.get(Calendar.MONTH)
				&& cal1.get(Calendar.DATE)==cal2.get(Calendar.DATE);
	}
	
	
	
}
